#include <signal.h>
#include <time.h>
#include "../inc/m_m_modbus.h"

void sig_handler(int sig) {
    if (sig == SIGINT || sig == SIGTERM) {
        m_modbus_scan_stop();
        m_modbus_heartbeat_stop();  // 停止心跳
        m_modbus_stop();
    }
}

// 设备生命周期监控线程：扫描→配置→连接→状态打印
void *device_lifecycle_thread(void *arg) {
    (void)arg;
    while (g_modbus_ctx.running) {
        // 1. 等待扫描完成（定时扫描每60秒一次）
        sleep(g_modbus_ctx.scan_cfg.scan_interval);

        // 2. 获取在线设备列表
        modbus_online_dev_t devs[MAX_ONLINE_DEVICES];
        int dev_cnt = m_modbus_get_online_devs(devs, MAX_ONLINE_DEVICES);
        if (dev_cnt <= 0) continue;

        // 3. 对每个在线设备执行：自动配置→自动连接
        for (int i = 0; i < dev_cnt; i++) {
            modbus_online_dev_t *dev = &devs[i];
            int conn_status = m_modbus_get_conn_status(dev);

            // 未配置：执行自动配置
            if (conn_status == -1 || conn_status == CONN_DISCONNECTED) {
                printf("\n===== Process device: %s =====\n",
                       dev->mode == MODBUS_MODE_RTU ?
                       (char[]){0} : dev->dev_id.tcp_ip);
                m_modbus_auto_config(dev);  // 自动配置（注册寄存器）
                m_modbus_auto_connect(dev);  // 自动连接
            }

            // 打印设备状态
            char status_str[32];
            switch (m_modbus_get_conn_status(dev)) {
                case CONN_CONNECTED: strcpy(status_str, "Connected"); break;
                case CONN_RECONNECTING: strcpy(status_str, "Reconnecting"); break;
                case CONN_ABNORMAL: strcpy(status_str, "Abnormal"); break;
                default: strcpy(status_str, "Disconnected"); break;
            }

            printf("Device %s: Status=%s, Last Online=%s\n",
                   dev->mode == MODBUS_MODE_RTU ?
                   (char[]){0} : dev->dev_id.tcp_ip,
                   status_str,
                   ctime(&dev->last_online));
        }
    }
    return NULL;
}

int main(void) {
    signal(SIGINT, sig_handler);
    signal(SIGTERM, sig_handler);

    // 1. 初始化Modbus框架（含模板加载、连接池初始化）
    if (m_modbus_init() != 0) {
        fprintf(stderr, "Modbus PnP init failed\n");
        return -1;
    }

    // 2. 启动自动扫描（定时发现设备）
    if (m_modbus_scan_start() != 0) {
        fprintf(stderr, "Start auto scan failed\n");
        m_modbus_deinit();
        return -1;
    }

    // 3. 启动心跳监控（自动重连+自动断开）
    if (m_modbus_heartbeat_start() != 0) {
        fprintf(stderr, "Start heartbeat failed\n");
        m_modbus_deinit();
        return -1;
    }

    // 4. 启动设备生命周期管理线程
    pthread_t lifecycle_thread;
    if (pthread_create(&lifecycle_thread, NULL, device_lifecycle_thread, NULL) != 0) {
        fprintf(stderr, "Create lifecycle thread failed\n");
        m_modbus_deinit();
        return -1;
    }

    // 5. 启动Modbus主服务（处理设备请求）
    if (m_modbus_start() != 0) {
        fprintf(stderr, "Modbus PnP start failed\n");
        m_modbus_deinit();
        return -1;
    }

    // 6. 等待线程结束
    pthread_join(lifecycle_thread, NULL);

    // 7. 释放资源
    m_modbus_deinit();
    return 0;
}